package com.yvon.service.demo.mybatis.session;

/**
 *
 * 用于定义执行 SQL 标准、获取映射器以及将来管理事务等方面的操作
 * 以把它理解成一种功能服务
 *
 * @author yvon
 * @since 2023-03-21
 */
public interface SqlSession {

    /**
     * Retrieve a single row mapped from the statement key
     * 根据指定的SqlID获取一条记录的封装记录
     *
     * @param <T>       the returned object type 封装之后的对象类型
     * @param statement sqlID
     * @return          Mapped object 封装之后的对象
     */
    <T> T selectOne(String statement);

    /**
     * Retrieve a single row mapped from the statement key and parameter.
     * 根据指定的SqlID获取一条记录的封装对象，只不过这个方法容许我们可以给sql传递一些参数
     * 一般在实际使用中，这个参数传递的是pojo，或者Map或者ImmutableMap
     * @param <T>       the returned object type
     * @param statement statement Unique identifier matching the statement to use.
     * @param parameter parameter A parameter object to pass to the statement.
     * @return Mapped object
     */
    <T> T selectOne(String statement, Object parameter);

    /**
     * Retrieves a mapper.
     * 得到映射器，这个巧妙的使用了泛型，使得类型安全
     *
     * @param type the mapper type
     * @return {@link T}
     */
    <T> T getMapper(Class<T> type);

    /**
     * Retrieves current configuration
     * 获取配置
     */
    Configuration getConfiguration();
}
